准备
下载配置清单
git clone https://github.com/prometheus-operator/kube-prometheus
根据你K8S版本,git checkout
到匹配的分支
修改service
修改manifests/prometheus-service.yaml
,将service类型改成nodeport,不改的话默认是clusterIP类型,集群外无法访问
同样修改manifests/grafana-service.yaml:
找到grafana-networkPolicy.yaml
和prometheus-networkPolicy.yaml
,可以考虑删除这两个文件。
我在这里踩了一个坑:由于我用的是云服务器,用公网ip一直无法访问nodeport暴露的grafana和prometheus,最后发现是这两个文件中的网络策略限制了。如果不是云服务器应该就没这个问题。
修改存储
Grafana和Prometheus默认未持久化存储,重启pod数据就丢失了。
修改prometheus-prometheus.yaml
,在spec下增加pvc:
spec:
storage:
volumeClaimTemplate:
spec:
storageClassName: local-path
resources:
requests:
storage: 100Gi
其中local-path
是我创建的一个本地存储的storageClass,具体可以参考使用local-path-provisioner动态创建本地磁盘pv
Grafana是deployment方式部署的,无法像Prometheus那样直接添加pvc,需要我们手动创建,我们把它放在manifests/setup目录下
setup/grafana-pvc.yaml
:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: grafana
namespace: monitoring
spec:
storageClassName: local-path
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
修改grafana-deployment.yaml
,找到grafana-storage,将emptyDir改成如下内容:
修改权限
这是一个坑,prometheus-clusterRole.yaml
中默认给的权限不足,导致只能无法获取pod列表,某些场景下会有问题。
例如我在部署kafka集群时,使用pod-monitor方式让prometheus自动发现kafka要监控的一些pod,但是prometheus没有list pods权限,就无法监控了。
修改完如下:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.37.0
name: prometheus-k8s
rules:
- apiGroups:
- ""
resources: # 这里要改
- nodes/metrics
- services
- endpoints
- pods
verbs: # 这里要改
- get
- list
- watch
- nonResourceURLs:
- /metrics
verbs:
- get
安装
# 安装
kubectl apply --server-side -f manifests/setup
# 等待上一步自定义的资源都创建完成
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
# 启动相关组件
kubectl apply -f manifests/
启停服务
# 启动服务
kubectl apply -f manifests/
# 停止服务
kubectl delete -f manifests/